package main

//#include <string.h>
import "C"
import (
	"bytes"
	"fmt"
	"math/rand"
	"time"
	"unsafe"
)

func memcpy(dest, src []byte) int {
	n := len(src)
	if len(dest) < len(src) {
		n = len(dest)
	}
	if n == 0 {
		return 0
	}
	C.memcpy(unsafe.Pointer(&dest[0]), unsafe.Pointer(&src[0]), C.size_t(n))
	return n
}
func genTestData() []byte {
	var data = make([]byte, 1024*1024*100)
	count := 0
	for {
		if n, err := rand.Read(data[count:]); err != nil {
			panic(err)
		} else {
			count += n
			if count >= 1024*1024*100 {
				break
			}
		}
	}
	return data
}
func main() {

	for i := 0; i < 5; i++ {
		fmt.Printf("------------第%d次测试----------------\n", i)
		src := genTestData()
		var dest1 = make([]byte, len(src))
		var dest2 = make([]byte, len(src))
		fmt.Println("生成随机测试数据，长度: ", len(src), "开始拷贝:")
		start1 := time.Now()
		memcpy(dest1, src)
		t1 := time.Now().Sub(start1)
		if bytes.Equal(src, dest1) && &src != &dest1 {
			fmt.Printf("使用C的memcpy函数: %d(%s)\n", len(dest1), t1)
		} else {
			fmt.Println("使用C的memcpy函数: 拷贝异常")
		}
		start2 := time.Now()
		copy(dest2, src)
		t2 := time.Now().Sub(start2)
		if bytes.Equal(src, dest2) && &src != &dest2 {
			fmt.Printf("使用go的copy函数: %d(%s)\n", len(dest2), t2)
		} else {
			fmt.Println("使用go的copy函数: 拷贝异常")
		}

	}
}
